package demo.java.lang.reflect;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MethodDemo {

    private static Logger logger = LoggerFactory.getLogger(MethodDemo.class);

    /**
     * 把参数名字保存在java字节码里，并且让这些参数名字在运行时可用。
     * <li>如果你编译这个class的时候没有添加参数–parameters，运行的时候你会得到这个结果：Parameter: arg0
     * <li>编译的时候添加了–parameters参数的话，运行结果会不一样：Parameter: args
     * 
     * 对于有经验的Maven使用者，–parameters参数可以添加到maven-compiler-plugin的配置部分：
     */
    @Test
    public void getParameters() throws Exception {
        Method method = ReflectDemo.class.getMethod("main", String[].class);
        System.out.println(method.toGenericString());
        logger.info("method={}", method);
        logger.info("toGenericString={}", method.toGenericString());
        logger.info("getName={}", method.getName());
        for (final Parameter parameter : method.getParameters()) {
            System.out.println("Parameter: " + parameter.getName());
        }
    }

    @Test
    public void getAnnotations() throws NoSuchMethodException, SecurityException {
        Method method = MethodDemo.class.getMethod("getAnnotations");
        Annotation[] annotations = method.getAnnotations();
        for (Annotation annotation : annotations) {
            System.out.println(annotation.annotationType() + " : " + annotation.toString());
        }

        Test test = method.getAnnotation(org.junit.Test.class);
        System.out.println("test.timeout() = " + test.timeout());
    }
}
